package cn.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import cn.utils.PageModel;





public interface CommonService {

	/**
	 *
	 * @param obj 传入需要保存的实体
	 * @author gshg
	 */
	public void saveDemo(Object obj);



	/**
	 *
	 * @param obj 传入需要更新的实体
	 * @author gshg
	 *
	 */
	public void updateDemo(Object obj);


	/**
	 *
	 * @param obj 传入需要删除的实体
	 * @author gshg
	 *
	 */
	public void deleteDemo(Object obj,Object[] id);



	/**
	 *
	 * @param id  String类型，需要查找的实体的主键（String类型）
	 * @param obj 需要查询的实体类
	 * @return Object 实际是查询出来的实体
	 * @author gshg
	 */
	public <T extends Serializable> T  findById(Object id, T t);

	/**
	 * 批量删除,按ID
	 * @param id 要删除数据的ID
	 * @param objID 要删除数据ID的类型，为String或INteger；
	 * @param obj 所删除的实体类型
	 */
	public void deleteBacthDemo(Object[] id,Object objID,Object obj);

	/**
	 *
	 * @param id  int类型，需要查找的实体的主键（int类型）
	 * @param obj 需要查询的实体类
	 * @return Object 实际是查询出来的实体
	 * @author gshg
	 */
	//public <T extends Serializable> T  findByIntId(int id, T t);



	/**
	 * @ 统计某一个表的记录数
	 * @param hql
	 * @return Integer 统计结果
	 */
	public Double  Stasistics(String hql);

	/**
	 * @ 用sql语句来进行批量的修改和删除
	 * @param sql 需要执行的sql语句
	 * @return  success: true;error:false
	 * @author gshg
	 */
	public boolean updateOrDeleteBySQL(String sql);



	/**
	 *
	 * @param pageModel
	 * @param listOne
	 * list里面保存的信息：list{String[]propertyName,String[]propertyCon,Object[] propertyValue,
	 * 					  String[] condition}
	 * propertyName:对应的属性名称，数组类型，用来组装HQL;propertyCon:属性名与属性值之间的条件（如like，=,>,<)
	 * propertyValue:对象数组，对应查询属性的值;condition:两个查询条件之间的连接条件
	 * 例如：propertyName[0] propertyCon[0] (String)propertyValue[0] condition[0] propertyName[0] propertyCon[1] (String)propertyValue[1]
	 * 类似：propertyName1 = propertyValue1 and  propertyName2 = propertyValue2
	 * listOne,listTwo,ListThree,listFour可以组装四组不同的查询条件;
	 * listOne,listTwo,ListThree,listFour 任何一个不为空，listOne必不为空
	 * @param conOne listOne 与   listTwo之间的连接条件
	 * @param listTwo
	 * @param conTwo
	 * @param ListThree
	 * @param conThree
	 * @param listFour
	 * @param conFour
	 * @param orderPropertyName   排序字段名称
	 * @param orderValue   排序值 asc，desc
	 * @return PageModel   分页工具，同时也是保存着返回的数据集
	 * @author gshg
	 */
	public PageModel findDataByPage(PageModel pageModel ,String tableName,List listOne,
					  String conOneTwo,List listTwo, String conTwoThree,
				   	  List listThree,String conThreeFour,List listFour,
				   	  String[] orderPropertyName, String[] orderValue);

	/**
     * @author gshg
     * @param objs 增加或修改的实体集合(实体集合可以是List，Set，Collection)
     */
    public   void  saveOrUpdateAll(Collection   objs);


    /**
     * @author gshg
     * @param objs 要删除的实体集合(实体集合可以是List，Set，Collection)
     */
    public void deleteAll(Collection objs);
    

	/**
	 * 现成的hql分页查询
	 * @param hql
	 * @param pm
	 * @return
	 * @author mzl
	 */
	public PageModel findByPage(final String hql, final PageModel pm);

}
